(function ($) {
    function Incpays(area_id, caller) {
        var vdiv = area_id+'Tab';
		var area = $('#'+area_id);

		area.css({'overflow':'hidden'})
		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');
        
		var pager_id = '#' + vdiv + 'Pager';
		var pager = $(pager_id);
		
        var el_cli_id;
        var el_cli_name;
        var cli_name = '';
		
        var el_build_id;
        var el_build_name;
        var build_name = '';
		
		var el_job_id;
		var el_itp_id;
		var el_itp_code;
		
		var el_bank_date;
        var el_status;
		
        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
        var col_names = ['ID', 'Статус', 'Банк,дата', 'Сумма', 'ID Клиента', 'Заказчик, клиент', 
						'ID Объекта', 'Объект', 'ID Работы', 'Назначение', 'Vid платежа', 
						'Вид платежа', 'ID в.платежа', '№ Счета', 'Договор', 'Комментарий'];
        var col_model = [
		    { name: 'id', index: 'incp_id', hidden: true, width: 1, editable: false, fixed: true },
		    { name: 'status', index: 'status', hidden: true, width: 1, editable: true, fixed: true,
				editoptions: { dataInit: function (el) { el_status = el; } }
			},
			{ name: 'incp_bank_date', index:'incp_bank_date', hidden: false, width:80, editable: true,
            	editoptions: { style: "width:250px;", dataInit: function (el) { el_bank_date = el; } },
				formoptions: { label: '<div class="jqg-form-label">Дата оплаты по банку</div>'}
			},         
		    { name: 'incp_amount', index: 'incp_amount', hidden: false, width: 80, editable: true,
            	editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Сумма платежа</div>'}
		    },
		    { name: 'incp_cli_id', index: 'incp_cli_id', hidden: true, width: 50, editable: true,
		        editoptions: { maxlength: "16", dataInit: function (el) { el_cli_id = el; } }
		    },
		    { name: 'cli_name', index: 'cli_name', hidden: false, width: 250, editable: true,
		        editoptions: { maxlength: "64", style: "width:250px;", dataInit: function (el) { el_cli_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Заказчик, клиент</div>'}
		    },
		    { name: 'incp_build_id', index: 'incp_build_id', hidden: true, width: 50, editable: true,
		        editoptions: { maxlength: "16", dataInit: function (el) { el_build_id = el; } }
		    },
		    { name: 'build_name', index: 'build_name', hidden: false, width: 100, editable: true,
		        editoptions: { maxlength: "64", style: "width:250px;", dataInit: function (el) { el_build_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Название объекта</div>'}
		    },
		    { name: 'incp_job_id', index: 'incp_job_id', hidden: true, width: 80, editable: true, 
		        editoptions: { maxlength: "16", readonly: "true", style: "width:250px;", dataInit: function (el) { el_job_id = el; } },
				formoptions: { label: '<div class="jqg-form-label">Идентификатор работы</div>'}
		    },
		    { name: 'incp_content', index: 'incp_content', hidden: false, width: 170, editable: true,
            	editoptions: { maxlength: "64", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Назначение платежа</div>'}
		    },
		    { name: 'incp_pm_type', index: 'incp_pm_type', hidden: false, width: 100, editable: true,
            	editoptions: { maxlength: "8", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Vid платежа</div>'}
		    },
		    { name: 'itp_code', index: 'itp_code', hidden: false, width: 80, 
				sortable: false, search: false, editable: true, edittype:'select',
		        editoptions: { value: '0:', style: "width:260px;", dataInit: function (el) { el_itp_code = el; } },
				formoptions: { label: '<div class="jqg-form-label">Вид платежа</div>'}
		    },
		    { name: 'incp_itp_id', index: 'incp_itp_id', hidden: true, width: 80,
				sortable: false, search: false, editable: true, 
		        editoptions: { maxlength: "16", readonly: "true", style: "width:250px;", dataInit: function (el) { el_itp_id = el; } },
				formoptions: { label: '<div class="jqg-form-label">ID в.платежа</div>'}
		    },
		    { name: 'incp_account', index: 'incp_account', hidden: false, width: 100, editable: true,
            	editoptions: { maxlength: "32", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Номер счета</div>'}
		    },
		    { name: 'incp_contract', index: 'incp_contract', hidden: false, width: 200, editable: true,
            	editoptions: { maxlength: "64", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Договор</div>'}
		    },
		    { name: 'incp_comment', index: 'incp_comment', hidden: false, width: 200, editable: true,
		        editoptions: { maxlength: "128",  style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Комментарий</div>'}
		    }
        ];

        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'incpays/index' },
            emptyrecords: true,
            autowidth: false,
            //		    scrollOffset: 22,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 40,
            multiboxonly: true,
//			multikey: 'ctrlKey',
            mtype: 'POST',
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 50,
            rowList: [50, 200, 1000],
            //		    viewrecords: true,
            loadui: 'disable',
            toolbar: [false, 'top'],
			toppager: false,
            filterbar: false,
            shrinkToFit: false,
            height: $('#'+area_id).innerHeight() - 77,
            width: $('#'+area_id).innerWidth() - 2,
            sortname: 'incp_bank_date',
            sortorder: 'desc',
            sortable: true,
            caption: '',
            loadError: function () {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32' );
                        break;
                }
				var row_id, status;
				var stats = gritab.getCol( 'status', true );
				for( var i=0; i<stats.length; i++ ) {
					row_id = stats[i].id;
					status = stats[i].value;
					if( (status & 2 ) == 2 ) {
						gritab.jqGrid('setCell',row_id,'incp_bank_date','','ui-state-error');
					}
				}
            },
            ondblClickRow: function (id, iRow, iCol) {
                $('#' + vdiv).jqGrid('editGridRow', id,
                {
					width: 450,
					resize: false,
                    modal: true,
                    jqModal: true,
//                    zIndex: app.jqgrid_form_min_z_index,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
// Autocomplete Select savekey must be disabled
//                    savekey: [true, 13],
                    editData: { q: 'incpays/update' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
					beforeSubmit: TestNewData, 
                    afterSubmit: responseOnSubmit,
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
                }
                );
            }
        };

		function onShowAddForm(fm) {
            BindCalendar(fm, el_bank_date);
			SetClientsHack();
			SetBuildHack();
            $('div#editmod' + vdiv).css({'overflow':'visible'}).shadow();
			
		}
		        
		function onShowEditForm(fm) {
			get_pm_codes();
            BindCalendar(fm, el_bank_date);
			SetClientsHack();
			SetBuildHack();
            $('div#editmod' + vdiv).css({'overflow':'visible'}).shadow();
			
		}
		        
		function onCloseEditForm() {
			$(el_cli_name).autocomplete( "destroy" ).unbind();
			$(el_build_name).autocomplete( "destroy" ).unbind();
			$(el_bank_date).datepicker( "destroy" ).unbind();
			$(el_itp_code).empty().unbind();
			return true;
		}
		
		function onShowDelForm() {
            $('div#delmod' + vdiv).shadow();
/*
            $('#DelTbl_' + vdiv + ' tr:eq(2) td').html(
                    '<p style="font-weight:700; text-align:center;">ВНИМАНИЕ !!!</p>' +
                    'Удаление записи(сей)  в этой таблице повлечет за собой<br>' +
                    'удаление соответствующих записей в таблице "Архив цен"' +
                    '<p style="text-align:center;">Выполнить удаление ?</p>'
            );
*/				
		}
				
// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Индикация ошибок при вводе, ред., удал.
        function TestNewData(pd, formid) {
            var result = true, mess = '';
            if( pd.incp_cli_id == '' || pd.incp_build_id == '' || pd.incp_bank_date == '') {
                result = false;
                mess = 'Данные введены с ошибками !!!';
            }
            return[result,mess];
        }
        
// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) {
                success = false;
                msg = rsp.errmess;
            }
				
            return [success, msg];
        }

// Навигатор - обновить
        gritab.jqGrid('navGrid', '#' + vdiv + 'Pager',
// Параметры инструментов
        {
            add: true, addtext: 'Создать', 
			del: true, deltext: 'Удалить', 
			edit: true, edittext: 'Изменить', 
			view: true, viewtext: 'Просмотр', 
			search: false,
            refresh: true, refreshtext: 'Обновить', 
			afterRefresh: function () { gritab.resetSelection(); }
        },
// Параметры редактирования
        {
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            editData: { q: 'incpays/update' },
			onInitializeForm: function( fm ) {
				$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
            afterShowForm: onShowEditForm,
            beforeSubmit: TestNewData, 
            afterSubmit: responseOnSubmit,
            viewPagerButtons: false,
            closeAfterEdit: true,
			onClose: onCloseEditForm
        },
// Параметры добавления
        {
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            editData: { q: 'incpays/insert' },
			onInitializeForm: function( fm ) {
				$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
            afterShowForm: onShowAddForm,
            beforeSubmit: TestNewData, 
            afterSubmit: responseOnSubmit,
			onClose: onCloseEditForm
        },
// Параметры удаления
        {
            modal: true,
            jqModal: true,
            width: 250,
			msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
				'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
			resize: false,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            delData: { q: 'incpays/delete' },
            afterShowForm: onShowDelForm,
            afterSubmit: responseOnSubmit
        },
		null,
		{
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.ui_dialog_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            viewPagerButtons: false,
			labelswidth: '35%',
			beforeShowForm: function(fm) { 
				$(fm).find("table:first td").css({'white-space':'normal','vertical-align':'top'});
				$('div#viewmod' + vdiv).shadow(); 
			}
        }
        );
        
// Пользовательский навигатор - выбор столбцов
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Столбцы',
			title: 'Выбор отображаемых столбцов',
			buttonicon: 'ui-icon-calculator',
			onClickButton: function(){ gritab.columnChooser(); }
		}); 
		
// Пользовательский навигатор - Сумма
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Сумма',
            title: 'Просуммаровать выделенное',
            buttonicon: 'ui-icon-circle-plus',
            onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				var rowlist = rowarr.toString();
				if( !rowlist ) {
					app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строки в таблице.", 'app-icon-stop32');
					return; 
				}
				var summa = 0;
				for( var i=0; i<rowarr.length; i++ ) {
					summa += Number(gritab.getCell( rowarr[i], 'incp_amount' ));
				}
				var result = "Число помеченных записей: <b>"+rowarr.length+"</b><br>"+
							"Cумма по колонке 'Сумма' : <b>"+summa.formatNumber('n2')+"</b>";
				app.alert('AlertDlg', 'Результат', result, 'app-icon-info32');
			}
        });
		
// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

// Прикрепить календарь к ячейке поиска
		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_incp_bank_date") );
		
        function BindCalendar(fm, el) {
            $(el).datepicker({
				onClose: function(dt, inst) { 
					if( $(fm).hasClass('ui-search-toolbar') && dt != '' ) gritab[0].triggerToolbar();
				},
                dateFormat: "dd.mm.yy",
                showOn: "button",
                buttonImage: "img/calendar2.png",
                buttonImageOnly: true,
                buttonText: "Календарь",
                changeMonth: true,
                changeYear: true
            });

            fm.find(".ui-datepicker-trigger")
                .css({ 'cursor': 'pointer', 'position': 'relative', 'left': '-18px', 'top': '3px' });
            $(el).attr("title", "Формат ввода: 'дд.мм.гггг'");                
        }

        function SetClientsHack() {
            $(el_cli_name).autocomplete({
				html: true,
				appendTo: 'div#editmod' + vdiv,
                source: function (request, responce) {
                    $.post('index.php', { q: 'clients/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.name, value: item.value }
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
					$(el_cli_id).val(ui.item.value);
                    cli_name = ui.item.label.replace(/<(b|\/b)>/g,'');
                    $(el_cli_name).val(cli_name);
					return false;
                }
            });
			
            $(el_cli_name).bind( 'change', function () {
// Проверка, что данные получены автозаполнением. 
                if( $(el_cli_id).val() == "" || $(el_cli_name).val() != cli_name ) {
                    $(el_cli_id).val('')
                    vend_name = '';
                }
			});
        }

        function SetBuildHack() {
            $(el_build_name).autocomplete({
				html: true,
				appendTo: 'div#editmod' + vdiv,
                source: function (request, responce) {
                    $.post('index.php', { q: 'jobs/find', term: request.term },
                    function (rsp, textStatus) {
						if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.build_name + ' ( '+item.jtp_descr+' )', 
										value: item.build_id, 
										build_name: item.build_name, 
										job_id:item.job_id,
										itp: item.itp
										}
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_build_id).val(ui.item.value);
                    build_name = ui.item.build_name.replace(/<(b|\/b)>/g,'');
                    $(el_build_name).val(build_name);
					$(el_job_id).val(ui.item.job_id);
					
                    $(el_itp_id).val('');
					set_itp_codes( ui.item.itp );
                    return false;
                }
            });
			build_name = $(el_build_name).val();
            $(el_build_name).bind( 'focusout', function () { 
                if( $(el_build_name).val() != build_name ) { 
                    build_name = '';
                    $(el_build_id).val("");
                    $(el_build_name).val("");
					
					$(el_job_id).val("");
                    $(el_itp_code).empty();
                    $(el_itp_id).val('');
                }
            });
            
			// Выбор из select			
            $(el_itp_code).bind( 'change', function () { $(el_itp_id).val( $(el_itp_code).val() );  });            
        }

        function get_pm_codes() {
			var job_id = $(el_job_id).val();
			if(job_id == '' || job_id == '0' ) return;
            $.post('index.php', { q: 'jobs/getpmcodes', job_id: job_id },
				function (rsp, textStatus) {
					if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
					if (rsp.errcode) {
						if (rsp.errcode == '999') { alert(rsp.errmess); }
						else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						return;
					}
					if (rsp.data) 
						set_itp_codes( rsp.data.itp );
				}, 
			'json');
        }
		
		function set_itp_codes( o ) {
			var sel = $(el_itp_code);
			var p = $(el_itp_id).val();
			
			sel.empty().append('<option value="0">Выберите из списка ...</option>');
			for( var i=0; i<o.length; i++) 
				sel.append('<option value="'+o[i].itp_id+'">'+o[i].itp_code+' "'+o[i].itp_descr+'"</option>');
				
			if( p == '' || p == '0' ) return;			
			sel.val(p);
		}
		
		this.Destroy = function() {
			$("#gview_" + vdiv + " #gs_incp_bank_date").datepicker( "destroy" ).unbind();
			gritab.GridDestroy(vdiv);
			area.find('*').remove();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.innerWidth() - 2 );
			gritab.setGridHeight( area.innerHeight() - 77 );
		};

	};  // End of create function definition


	function IncpaysProxy() {
		var oTab, area;
		var active = false;
		
		this.Open = function( area_id ) {
			if( active  ) return;
			area = area_id;
			$('#'+area+'Title').show();
			oTab = new Incpays( area_id, this ); 
			$(window).bind( 'resize', oTab.Resize );
			active = true;
		};
		this.Close = function() { 
			if( !active  ) return;
			$(window).unbind( 'resize', oTab.Resize );
			oTab.Destroy(); 
			$('#'+area+'Title').hide();
			active = false;
		};
		this.Resize = function() { oTab.Resize(); };
	}
	
	app.Incpays = new IncpaysProxy();

    // ---------------------------------------------------------------------------
})(jQuery);
